package object3;

/**
 * 成员内部类的使用
 */
public class MemberInnerClass01 {

    public static void main(String[] args) {
        /*
            成员内部类是定义在外部类的成员位置，并且没有static修饰。
            可以直接访问外部类所有成员包含私有的
            可以添加任意访问修饰符（地位就是成员）
            作用域和外部类的其他成员一样，为整个整体
            成员内部类 ——访问——》外部类成员 直接访问
            外部类 ——访问——》成员内部类 创建对象再访问
            外部其他类 ——访问——》成员内部类
            如果外部类和内部类的成员重名时，内部类访问的话，默认遵循就近原则，如果想访问外部类的成员
            则可以使用 外部类名.this.成员 去访问
         */

        Outer08 outer08 = new Outer08();
        outer08.t1();

        //外部其他类 使用成员内部类的两种方式
        /*
            Outer08.Inner08 inner08 = outer08.new Inner08(); 相当于把 new Inner08()当作是 outer08 成员
            Outer08.Inner08 inner08Instance = outer08.getInner08Instance(); 在外部类中写一个方法返回一个成员内部类对象
         */
    }
}

class Outer08 {

    private int n1 = 10;

    public String name = "张三";

    private void hi() {

        System.out.println("hi()方法...");

    }

    public class Inner08 {

        private double sal = 99.8;

        private int n1 = 66;

        public void say() {
            System.out.println("n1 = " + n1 + " name = " + name + " 外部类的 n1=" + Outer08.this.n1);
            hi();
        }
    }

    public Inner08 getInner08Instance() {
        return new Inner08();
    }

    //写方法
    public void t1() {
        //使用成员内部类
        //创建成员内部类对象，然后使用相关方法
        Inner08 inner08 = new Inner08();

        inner08.say();

        System.out.println(inner08.sal);
    }
}